// middlewares/logger.go
package middlewares

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"github.com/gin-gonic/gin"
)

// 定义全局日志文件句柄（程序启动时初始化）
var logFile *os.File

// 初始化日志文件（在程序启动时调用，如main函数中）
func InitLogFile(logDir string) error {
	// 创建日志目录（如果不存在）
	if err := os.MkdirAll(logDir, 0755); err != nil {
		return fmt.Errorf("创建日志目录失败: %v", err)
	}

	// 日志文件名（按日期命名，如 2025-07-24.log）
	filename := time.Now().Format("2006-01-02") + ".log"
	logPath := filepath.Join(logDir, filename)

	// 打开文件（追加模式，不存在则创建，权限0644）
	var err error
	logFile, err = os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return fmt.Errorf("打开日志文件失败: %v", err)
	}
	return nil
}

// Logger 自定义请求日志中间件（输出到文件）
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		startTime := time.Now()
		c.Next()
		endTime := time.Now()
		latency := endTime.Sub(startTime)

		method := c.Request.Method
		path := c.Request.URL.Path
		statusCode := c.Writer.Status()
		clientIP := c.ClientIP()

		// 格式化日志内容
		logMsg := fmt.Sprintf(
			"[GIN] %s | %3d | %13v | %15s | %-7s %s\n",
			endTime.Format("2006-01-02 15:04:05"),
			statusCode,
			latency,
			clientIP,
			method,
			path,
		)

		// 同时输出到控制台和文件（可选）
		fmt.Print(logMsg) // 控制台
		if logFile != nil {
			logFile.WriteString(logMsg) // 文件
		}
	}
}
